package homework.day05;

/**
 * @description: 递归求十进制转换成二进制, 正整数 N>0
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 十进制转换成二进制的方法：
 * 用2整除十进制整数，可以得到一个商和余数；
 * 再用2去除商，又会得到一个商和余数，如此进行，直到商为小于1（等于0）时为止
 * 最后倒读余数，得到一个二进制的数
 */
public class DecimalToBinaryDemo {
    public static void main(String[] args) {
        decimalToBinary(2141);
    }

    /*
         分析：
         既然是使用递归求解，那就需要往递归的思想——分解问题上面去靠。
         在打印二进制数的过程中，实际上是一个除以2取余，然后倒读余数的过程。
         也就是一次方法调用只打印一次余数
         下次就继续打印除以2商的余数，这就是递归体。

         递归体找到后，再找递归的出口，在这个除以2取余然后倒读的过程中
         其实只要商小于2，其实就没必要继续进行了
         因为如果商是1，直接打印余数1就可以了，无需计算了

         最后最重要的就是如何实现倒读余数呢？
         这里需要借助栈的一个先进后出的特性 -> 递归体，一定要在打印余数的上面
         这样就能倒读余数了。

     */
    public static void decimalToBinary(int n) {
        //如果商是0了，表示递归需要结束了
        if (n >= 2) {
            //只要商不是0，就继续递归
            decimalToBinary(n / 2);
        }
        System.out.print(n % 2);
    }
}
